package org.micode.demo.web.controller;

import java.util.List;

import org.micode.common.helper.I18nMsgHelper;
import org.micode.common.validater.InsertGroup;
import org.micode.common.validater.UpdateGroup;
import org.micode.demo.web.vo.DisableUpdateVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

import javax.validation.constraints.NotNull;

import org.micode.common.enums.OperationModeEnum;
import org.micode.common.annotation.SysLog;
import org.micode.common.domain.ApiResult;
import org.micode.common.domain.DataPage;
import org.micode.common.domain.vo.KeyVO;
import org.micode.common.utils.StringExtUtils;
import org.micode.common.annotation.PermissionsFlag;
import org.micode.demo.web.base.BaseWebAdminController;
import org.micode.demo.db.domain.dto.SysClientDTO;
import org.micode.demo.db.domain.query.SysClientQuery;
import org.micode.demo.web.service.SysClientService;

/**
 * 客户端应用管理
 *
 * @author: wutianbin
 * @version: v1.0.27
 * @CreateDate: 2021-11-10
 */
@Slf4j
@RestController
@RequestMapping("/web-admin/sys/client")
public class SysClientController
        extends BaseWebAdminController {

    @Autowired
    private SysClientService sysClientService;

    /**
     * 分页查询客户端应用列表数据
     *
     * @param dataQuery 查询条件，如果条件中不包含page对象，则系统会指定一个默认的page对象。
     * @return 返回查询结果记录集
     */
    @PostMapping("/list")
    @PermissionsFlag("sys:client:list")
    public ApiResult<DataPage<SysClientDTO>> list(
            @RequestBody SysClientQuery dataQuery) {
        log.debug(I18nMsgHelper.get("api.call.sysClient.list") + " == {}", dataQuery);
        return listForQuery(sysClientService::list, dataQuery);
    }

    /**
     * 按主键查询客户端应用详细信息
     *
     * @param clientId 要查询的主键值, 例如：{"key": "1"}
     * @return 主键对应的对象
     */
    @PostMapping("/info")
    @PermissionsFlag("sys:client:info")
    public ApiResult<SysClientDTO> info(
            @RequestBody @Validated KeyVO<Long> clientId) {
        log.debug(I18nMsgHelper.get("api.call.sysClient.info") + " == {}", clientId.getKey());
        return invokeMethod(sysClientService::info, clientId);
    }

    /**
     * 禁用处理，禁用/启用都是这个接口处理
     *
     * @param disableUpdateVO 禁用信息
     * @return 处理影响的记录数
     */
    @SysLog(value = "{api.syslog.sysClient.disable}", operationMode = OperationModeEnum.UPDATE)
    @PostMapping("/disable")
    @PermissionsFlag("sys:client:update")
    public ApiResult<Integer> disable(
            @RequestBody @Validated(UpdateGroup.class) DisableUpdateVO<Long> disableUpdateVO) {
        log.debug(I18nMsgHelper.get("api.call.sysClient.disable") + " == {}", disableUpdateVO);
        SysClientDTO updateDTO = new SysClientDTO();
        updateDTO.setClientId(disableUpdateVO.getId());
        updateDTO.setDisableFlag(disableUpdateVO.getDisableFlag());
        return updateTheDTO(sysClientService::update, updateDTO);
    }

}
